#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

const std::string myenv="HELLO=AAAAAAAAAAAAAAAAAAAA";

extern char **environ;
int main()
{
    //在原有环境变量上增加新的
    putenv((char*)myenv.c_str());

    pid_t id = fork();
    
    if(id == 0)
    {
        char *const argv[] = {
            (char*)"other",
            nullptr
        };

        //(void)argv;
        char *const env[] = {
            (char*)"HELLO=bite",
            (char*)"HELLO1=bite1",
            (char*)"HELLO2=bite2",
            (char*)"HELLO3=bite3"
        };
        
        //允许自己传入环境变量
        // 传入的会覆盖继承来的
        // 该方法会使用传入的新的环境变量
        // 我们可以自己写一个全新的，也可以在原有环境变量后面添加新的项
        execvpe("./other", argv, environ);
        
        //可以自动查找环境变量，第一个参数不需要指明路径
        execvp(argv[0], argv);

        //和execl一样，只是第二个参数变成了数组
        execv("/usr/bin/ls", argv);
        
        // execl最后一个参数必须是nullptr
        // 第一个参数代表要执行谁
        // 后面的可变参数列表表明要怎么执行
        execl("/bin/ls", "ls", "-l", "--color", "-a", nullptr);
        execl("./other", "other", nullptr);
        execl("/usr/bin/python", "python", "test.py", nullptr);
        execl("/usr/bin/bash", "bash", "test.sh", nullptr);
        
        //自动查找环境变量，第一个参数不需要指明路径
        execlp("ls", "ls", "--color", "-aln", nullptr);
        
        //如果程序替换失败，结束子进程返回错误码 -> 1
        exit(1);
    }
   
    // father
    pid_t rid = waitpid(id, nullptr, 0);
    if(rid > 0)
    {
        printf("等待子进程成功!\n");
    }

    return 0;
}

